function Livro(id, titulo, sinopse, autor, editora, imagem, tags, disp) {
    this.id = id;
	this.titulo = titulo;
	this.sinopse = sinopse;
	this.autor = autor;
	this.editora = editora;
	this.imagem = imagem;
    this.tags = tags;    
	this.disp = disp;
    this.reservado = false;
}

var livros = new Array();
livros.push(new Livro(1, "Apelacao Civel", "A obra enfoca desde os primordios da apelacao ate o exame da legislacao processual em vigor, acentuando a nova concepcao dos efeitos da apelacao, que nao se restringem aos ja conhecidos devolutivos e suspensivos.",
					  "Marco Aurelio Moreira Bortowski", "Livraria do Advogado", "ApelacaoCivel.jpg", ["Direito", "Advocacia", "Apelacao"] , 5));
livros.push(new Livro(2, "Da Acao Penal", "Em Da Acao Penal, Flavio Meirelles examina os artigos do CPP que versam sobre a materia. Os tipos de acao penal. A denuncia, seus elementos, sua validade e nulidade, as causas de seu nao-recebimento e rejeicao.",
					  "Flavio M. Medeiros", "Livraria do Advogado", "AcaoPenal.jpg", ["Direito", "Advocacia", "Acao Penal"], 0));
livros.push(new Livro(3, "Estruturas de Dados", "Trata das estruturas de dados mais comuns, suas representacoes mais usadas, exemplos de suas aplicacoes e a importancia em computacao. Exige conhecimentos equivalentes ao curso introdutorio de computacao.",
					  "Paulo A.s. Veloso", "Campus", "EstruturaDados.jpg", ["Algoritmos", "Computacao", "Programacao", "Estrutura de Dados"], 17));
livros.push(new Livro(4, "Complexidade de Algoritmos", "Algoritmos sao o cerne da computacao: um programa codifica um algoritmo de modo a ser executado em um computador, resolvendo assim um problema. Este livro apresenta complexidade de algoritmos, metodos e problemas, com enfase em conceitos e seu emprego em analise e projeto. O texto foi planejado para ser usado em cursos, tanto de graduacao, quanto de pos-graduacao. Os topicos sao abordados de forma sistematica e acessivel. A apresentacao dos conceitos e entremeada de exemplos ilustrativos e exercicios (alguns com sugestoes), de modo que o leitor e convidado a participar ativamente do desenvolvimento. Esses exercicios sao complementados por listas de exercicios adicionais ao final de cada capitulo. Este e o volume 13 da Serie Livros Didaticos.",
					  "Paulo A.s. Veloso", "Sagra Luzzatto", "ComplexidadeAlgoritmos.jpg", ["Algoritmos", "Computacao", "Programacao", "Complexidade"], 5));
livros.push(new Livro(5, "Tropical Sol da Liberdade", "Este e um Emocionante Relato das Desventuras da Juventude Brasileira Pos-64. os Fatos que Fizeram a Historia Dramatica Desta Epoca sao Contados com o Ritmo Violento e a Respiracao Entrecortada com que Foram Vividos.",
					  "Ana Maria Machado", "Nova Fronteira", "TropicalLiberdade.jpg", ["Ditadura", "Historia", "Aventura"], 0));
livros.push(new Livro(6, "De Carta em Carta", "Pepe nao ia a escola. Um dia, resolveu mandar uma carta para o avo, e pediu ajuda a um escrevedor. De carta em carta, Pepe descobre que a escola e um lugar legal.",
					  "Ana Maria Machado", "Nova Fronteira", "CartaEmCarta.jpg", ["Infantil"], 2));                                        
livros.push(new Livro(7, "Casais: Historias de Amor que Resistem ao Tempo", "Quem nunca viveu um grande amor? E uma desilusao? Os seres humanos estao sempre em busca de um par perfeito e isso pode ser comprovado desde os primordios da historia. Apoiada na tematica dos relacionamentos, a editora Nova Fronteira lanca o gift-book Casais. Com prefacio da escritora Martha Medeiros, o livro apresenta dez casais famosos - ha duplas biblicas, como Adao e Eva, e personalidades da Historia (Cleopatra e Marco Antonio), da literatura (Machado de Assis e Carolina), da musica (John Lennon e Yoko Ono) e ate mesmo da ficcao (Romeu e Julieta) - analisando sua influencia na sociedade contemporanea. Alem de casos curiosos envolvendo os casais ja citados, ha um passeio pelas biografias amorosas das duplas Napoleao Bonaparte e Josefina; Lampiao e Maria Bonita; Oswald de Andrade e Tarsila do Amaral; Salvador Dali e Gala; Jorge Amado e Zelia Gattai. Os personagens e suas peculiaridades ajudam o leitor a entender a natureza do amor e como a parceria proporcionada por esse sentimento foi decisiva em diversos momentos da Historia.",
					  "Martha Medeiros", "Nova Fronteira", "Casais.jpg", ["Romance", "Amor", "Contos"], 7));                     
livros.push(new Livro(8, "A Lista de Schindler", "Durante a Segunda Guerra Mundial, enquanto o regime nazista enviava milhares de prisioneiros aos fornos de Auschwitz, o industrial alemao Oskar Schindler abrigava centenas de judeus em sua fabrica, de onde ele finalmente os transferia em seguranca para a Tchecoslovaquia. Um lugar na lista de Schindler significava a unica chance de sobrevivencia para um prisioneiro judeu. Oskar Schindler, o heroi do Holocausto, e retratado de modo inedito e comovente pelo romancista Thomas Keneally, que passou dois anos entrevistando sobreviventes beneficiados por Schindler em sete paises - Australia, Israel, Alemanha Ocidental, austria, EUA, Argentina e Brasil. Escrito com paixao, mas tambem com absoluta fidelidade aos fatos, o autor realizou uma espantosa recriacao de um episodio historico, narrado com toda a enfase de uma ficcao.",
					  "Thomas Keneally", "Bestbolso", "ListaSchindler.jpg", ["Guerra", "Historia", "Holocausto", "Nazismo"], 4));
livros.push(new Livro(9, "A Cidade e o Rio", "O vale Macleay, na Australia, nunca mais seria o mesmo apos aquele fim de seculo. No primeiro ano de 1900, tragicos e bizarros acontecimentos ocorrem e impressionam os habitantes da regiao, a comecar pelo superticioso Tim Shea.",
					  "Thomas Keneally", "Bestbolso", "CidadeRio.jpg", ["Aventura", "Historia"], 5));
livros.push(new Livro(10, "Medo de Voar", "Isadora, sonhadora compulsiva, sempre em busca de salvadores e psiquiatras, autora de um livro de poemas eroticos, relata suas aventuras e desventuras a partir de um Congresso Psicanalitico acontecido em Viena.",
					  "Erica Jong", "Bestbolso", "MedoVoar.jpg", ["Aventura"], 1));
                      
var mousePressionado = false;
var mouseDeixou = false;
var x, y, xBox, yBox;                                                                                                              

function populaLista() {
    var livrosFiltrados = filtraLivros();
    JQ("#listaReserva").html("");
    if(livrosFiltrados.length > 0) {
        for(var i = 0; i < livrosFiltrados.length; i++) {
            if(i % 4 == 0)
                JQ("#listaReserva").append('<ul></ul>');
                
            JQ("#listaReserva ul:last").append("<li class='itemLista' >" +
                                                   "<div class='divItemLista' id='itemLista"+ livrosFiltrados[i].id +"' onclick='abreDetalhe("+ livrosFiltrados[i].id +")'>" +
                                                      "<img border='0' width='160' height='160' src='images/"+ livrosFiltrados[i].imagem +"' />" + 
                                                   "</div>" +   
                                               "</li>");
            if(livrosFiltrados[i].disp == 0)
                JQ("#listaReserva ul:last li:last > div").append("<div class='desabilitado'></div>");    
        }
    }
    else
        document.getElementById("listaReserva").innerHTML = "<h2>Nenhum registro encontrado.</h2>";
        
    //popular a lista dos livros reservados
    var temReservado = false;
    for(var i = 0; i < livros.length; i++){
        if(livros[i].reservado){
            temReservado = true;
            break;
        }
    }
    if(temReservado) {
        JQ("#listaReservados").html("<ul></ul>");
        for(var i = 0; i < livros.length; i++){
            if(livros[i].reservado) {
                JQ("#listaReservados > ul").append("<li>" +
                                                      "<span>- "+ livros[i].titulo +"</span>" + "&#160;" +
                                                      "<a onclick='reservaLivro(" + livros[i].id +")'>X</a>" +  
                                                   "</li>");
            }
        }        
    }
    else {
        JQ("#listaReservados").html("<p>Nenhuma reserva feita.</p>");
    }
}

function filtraLivros() {
    var titulo = JQ("#titulo").val();
    var autor = JQ("#autor").val();
    var editora = JQ("#editora").val();
    var tag = JQ("#tag").val();
    var disponiveis = JQ("#disp").val();
    var filtro, j = 0;
    var livrosFiltrados = new Array();
    for(var i = 0; i < livros.length; i++) {
        filtro = (titulo == "" || livros[i].titulo.match(titulo)) && (autor == "" || livros[i].autor.match(autor)) && (editora == "" || livros[i].editora.match(editora)) && (tag == "" || contem(tag, livros[i].tags)) && (disponiveis == 0 || (disponiveis == 1 && livros[i].disp > 0) || (disponiveis == 2 && livros[i].disp == 0));
        if(filtro) {
            livrosFiltrados[j] = livros[i];
            j++;
        }    
    }
    
    return livrosFiltrados;
}

function abreDetalhe(id) {
    var pageSize = getPageSize();
    var livro;
    for(var i = 0; i < livros.length; i++) {
        if(livros[i].id == id){
            livro = livros[i];
            break;
        }
    }
    
    JQ("body").append("<div id='sombra' style='height:"+ pageSize.pageHeight +"px'></div>");
    JQ("#sombra").fadeTo(1000, 0.7);
    
    JQ("body").append("<div id='detalhe'>" +
                         "<div id='fechar' onclick='fechaDetalhe()'>Fechar X</div>" +
                         "<img width='160' height='160' src='images/"+ livro.imagem +"'/>" +
                         "<div class='titulo'>"+ livro.titulo +"</div>" +
                         "<div class='sinopse'>"+ livro.sinopse +"</div>" +
                         "<div class='itemDetalhe'><b>Autor: </b>"+ livro.autor +"</div>" +
                         "<div class='itemDetalhe'><b>Editora: </b>"+ livro.editora +"</div>" +
                         "<div class='itemDetalhe' id='detDisp'><b>Disponibilidade: </b>"+ livro.disp +"</div>" +
                         "<div class='itemDetalhe'><b>Palavras-chave: </b>"+ retornaTags(livro.tags) +"</div>" +   
                      "</div>"); 
    if(livro.disp > 0 || livro.reservado) {
        JQ("#detalhe").append("<div class='itemDetalhe submit'>" +
                                "<input type='submit' id='btReserva' onclick='reservaLivro(" + livro.id +")' value='"+ retLabelReserva(livro.id) +"'/>" +
                              "</div>");
    }
    ajustaDetalhe();                                    
    JQ("#detalhe").slideDown(1000);
}

function retornaTags(tags) {
    var ret = "";
    for(var i = 0; i < tags.length; i++ ) {
        ret += tags[i];
        if(i < tags.length-1)
            ret += ", "; 
    }
    return ret;
}

function reservaLivro(id) {
    var livro = getLivro(id); 
    if(livro.reservado)
        livro.disp++;
    else
        livro.disp--;
    livro.reservado = !livro.reservado;    
    populaLista();
    if(document.getElementById('detalhe')) {
        JQ("#detDisp").html('<b>Disponibilidade: </b>' + livro.disp);
        JQ("#btReserva").val(retLabelReserva(id));    
    }
}

function retLabelReserva(id) {
    var livro = getLivro(id);  
    if(!livro.reservado) 
        return "RESERVAR ESTE LIVRO";
    else
        return "DESFAZER A RESERVA";
}

function getLivro(id) {
    var livro = null
    for(var i = 0; i < livros.length; i++) {
        if(livros[i].id == id) {
            livro = livros[i];
            break;
        }
    }
    if(livro == null) {
        alert('erro! id de livro invalido');
    } 
    return livro;
}

function fechaDetalhe() {
    JQ('#sombra').fadeOut(1000);
    JQ('#detalhe').slideUp(1000, removerDetalhe);
}

function removerDetalhe() {
    JQ('#sombra').remove();
    JQ('#detalhe').remove();
}

function ajustaDetalhe() {
    var largura = 500;
    var altura = 450;
    var box = document.getElementById('detalhe');
    if(box) {
        var pageSize = getPageSize();
        var pageScroll = getPageScroll();
        var boxTop = pageScroll.yScroll + ((pageSize.windowHeight - altura) / 2);
        var boxLeft = ((pageSize.windowWidth - largura) / 2);
        box.style.width = largura + "px";
        box.style.height = altura + "px";        
        box.style.top = (boxTop < 0) ? "0px" : boxTop + "px";
        box.style.left = (boxLeft < 0) ? "0px" : boxLeft + "px";
    }
}

function contem(string, array) {
    for(var i = 0; i < array.length; i++) {
        if(array[i] == string)
            return true;
    }
    return false;
}

JQ(document).ready(function() {
   
    populaLista();
    window.onresize = ajustaDetalhe;    
});
